#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_NeoPixel.h>

// ==== 硬件配置 ====
// NeoPixel配置
#define NUM_PIXELS 16
#define PIN_NUM 2  // NeoPixel引脚（GPIO2）
#define NEO_TYPE NEO_GRB + NEO_KHZ800
Adafruit_NeoPixel strip(NUM_PIXELS, PIN_NUM, NEO_TYPE);

// OLED配置
#define SCREEN_WIDTH 128 // OLED宽度
#define SCREEN_HEIGHT 32 // OLED高度
#define OLED_RESET -1    // 无复位引脚
#define OLED_SDA 21      // OLED SDA引脚（GPIO21）
#define OLED_SCL 5       // OLED SCL引脚（GPIO5）
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// 光敏传感器配置
#define LIGHT_SENSOR_PIN A0 // 光敏传感器模拟引脚（A0）

// ==== 全局变量 ====
int brightnessPercent = 0; // 亮度百分比

// ==== 函数声明 ====
void updateOLED();
void adjustStripBrightness();

void setup() {
  // 初始化串口
  Serial.begin(115200);
  
  // 初始化NeoPixel
  strip.begin();
  strip.clear();
  strip.show(); // 清空显示
  
  // 初始化OLED
  Wire.begin(OLED_SDA, OLED_SCL);
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 初始化OLED地址0x3C
    Serial.println("SSD1306初始化失败");
    for (;;); // 停止执行
  }
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(1);
  display.print("亮度监测系统");
  display.display();
  delay(1000);
  
  // 初始化光敏传感器
  pinMode(LIGHT_SENSOR_PIN, INPUT);
}

void loop() {
  // 读取光敏传感器值并转换为百分比
  int sensorValue = analogRead(LIGHT_SENSOR_PIN);
  brightnessPercent = map(sensorValue, 0, 1023, 0, 100);
  brightnessPercent = constrain(brightnessPercent, 0, 100);
  
  // 根据亮度调节灯带亮度
  adjustStripBrightness();
  
  // 更新OLED显示
  updateOLED();
  
  // 延时刷新
  delay(300);
}

// ==== 功能函数 ====
// 调整灯带亮度
void adjustStripBrightness() {
  uint8_t r, g, b;
  
  // 根据亮度百分比设置颜色亮度（示例：橙色渐变亮度）
  if (brightnessPercent > 80) {
    r = g = b = 30; // 低亮度
  } else if (brightnessPercent > 50) {
    r = 150; g = 80; b = 0; // 中等亮度
  } else {
    r = 255; g = 100; b = 0; // 高亮度
  }
  
  // 设置所有LED颜色
  for (int i = 0; i < NUM_PIXELS; i++) {
    strip.setPixelColor(i, r, g, b);
  }
  strip.show();
}

// 更新OLED显示
void updateOLED() {
  display.clearDisplay();
  
  // 显示亮度百分比
  display.setTextSize(2);
  display.setCursor(30, 0);
  display.print(brightnessPercent);
  display.print("%");
  
  // 显示亮度等级
  display.setTextSize(1);
  display.setCursor(0, 24);
  if (brightnessPercent > 80) {
    display.print("亮度：低");
  } else if (brightnessPercent > 50) {
    display.print("亮度：中");
  } else {
    display.print("亮度：高");
  }
  
  display.display();
}